package modules

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gspeed/bootstrap/global"
	"time"
)

type orm struct {
	connect *gorm.DB
}

var Orm orm

func (o *orm) New() *gorm.DB {
	o.initConnect()
	o.initPool()
	return o.connect
}

func (o *orm) initConnect() {
	// 数据库 默认配置
	global.Config.SetDefault("database.user", "root")
	global.Config.SetDefault("database.password", "")
	global.Config.SetDefault("database.host", "localhost")
	global.Config.SetDefault("database.port", 3306)
	global.Config.SetDefault("database.dbname", "")
	global.Config.SetDefault("database.params", "charset=utf8&parseTime=True&loc=Local")

	// 组织数据库连接信息
	dsn := fmt.Sprintf(
		"%s:%s@tcp(%s:%d)/%s?%s",
		global.Config.GetString("database.user"),
		global.Config.GetString("database.password"),
		global.Config.GetString("database.host"),
		global.Config.GetInt("database.port"),
		global.Config.GetString("database.dbname"),
		global.Config.GetString("database.params"),
	)
	// 连接数据库
	var err error
	o.connect, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(fmt.Errorf("Connect Database Error: %s \n", err))
	}
	return
}

func (o *orm) initPool() {
	// 连接池 默认配置
	global.Config.SetDefault("database.pool.maxIdleConns", 100)
	global.Config.SetDefault("database.pool.maxOpenConns", 100)
	global.Config.SetDefault("database.pool.connMaxLifetime", 60)

	// 获取通用数据库对象 sql.DB，然后使用其提供的功能
	sqlDB, err := o.connect.DB()
	if err != nil {
		panic(fmt.Errorf("Init Database Pool Error: %s \n", err))
	}
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(global.Config.GetInt("database.pool.maxIdleConns"))

	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(global.Config.GetInt("database.pool.maxOpenConns"))

	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	minute := global.Config.GetInt("database.pool.connMaxLifetime")
	sqlDB.SetConnMaxLifetime(time.Duration(minute) * time.Minute)
	return
}
